# Лекция: Builder Pattern в Java

Builder (строитель) - это порождающий шаблон проектирования, который позволяет создавать сложные объекты шаг за шагом. Он особенно полезен, когда у объекта много параметров, некоторые из которых могут быть опциональными.

## Пример класса с Builder

```java
public class Car {
    private String make;
    private String model;
    private int year;
    private String color;

    private Car(Builder builder) {
        this.make = builder.make;
        this.model = builder.model;
        this.year = builder.year;
        this.color = builder.color;
    }

    public static class Builder {
        private String make;
        private String model;
        private int year;
        private String color;

        public Builder(String make, String model) {
            this.make = make;
            this.model = model;
        }

        public Builder year(int year) {
            this.year = year;
            return this;
        }

        public Builder color(String color) {
            this.color = color;
            return this;
        }

        public Car build() {
            return new Car(this);
        }
    }
}
```

В этом примере `Car.Builder` имеет методы для установки каждого из параметров `Car`. Методы `year` и `color` являются опциональными, так как они возвращают `this`, что позволяет вызывать их в цепочке.

## Использование Builder

```java
Car car = new Car.Builder("Toyota", "Camry")
    .year(2020)
    .color("Black")
    .build();
```

В этом примере `Car` создается с помощью `Car.Builder`. Сначала задаются обязательные параметры "Toyota" и "Camry", затем опциональные параметры 2020 и "Black", и в конце вызывается метод `build` для создания объекта `Car`.

---

# Практические задания

1. **Создайте класс `User` с полями `firstName`, `lastName`, `email` и `phone`. Добавьте внутренний класс `Builder` с методами для установки этих полей и методом `build`.** (Сложность: 2/5)
```java
public class User {
    private String firstName;
    private String lastName;
    private String email;
    private String phone;

    private User(Builder builder) {
        this.firstName = builder.firstName;
        this.lastName = builder.lastName;
        this.email = builder.email;
        this.phone = builder.phone;
    }

    public static class Builder {
        private String firstName;
        private String lastName;
        private String email;
        private String phone;

        public Builder firstName(String firstName) {
            this.firstName = firstName;
            return this;
        }

        public Builder lastName(String lastName) {
            this.lastName = lastName;
            return this;
        }

        public Builder email(String email) {
            this.email = email;
            return this;
        }

        public Builder phone(String phone) {
            this.phone = phone;
            return this;
        }

        public User build() {
            return new User(this);
        }
    }
}
```

2. **Создайте объект `User` с помощью `User.Builder`.** (Сложность: 1/5)
```java
User user = new User.Builder()
    .firstName("John")
    .lastName("Doe")
    .email("john.doe@example.com")
    .phone("1234567890")
    .build();
```

3. **Добавьте в класс `User` поле `address` и соответствующий метод в класс `Builder`.** (Сложность: 2/5)
```java
public class User {
    private String firstName;
    private String lastName;
    private String email;
    private String phone;
    private String address;

    private User(Builder builder) {
        this.firstName = builder.firstName;
        this.lastName = builder.lastName;
        this.email = builder.email;
        this.phone = builder.phone;
        this.address = builder.address;
    }

    public static class Builder {
        private String firstName;
        private String lastName;
        private String email;
        private String phone;
        private String address;

        public Builder firstName(String firstName) {
            this.firstName = firstName;
            return this;
        }

        public Builder lastName(String lastName) {
            this.lastName = lastName;
            return this;
        }

        public Builder email(String email) {
            this.email = email;
            return this;
        }

        public Builder phone(String phone) {
            this.phone = phone;
            return this;
        }

        public Builder address(String address) {
            this.address = address;
            return this;
        }

        public User build() {
            return new User(this);
        }
    }
}
```

4. **Создайте объект `User` с помощью `User.Builder` и установите поле `address`.** (Сложность: 1/5)
```java
User user = new User.Builder()
    .firstName("John")
    .lastName("Doe")
    .email("john.doe@example.com")
    .phone("1234567890")
    .address("123 Main St")
    .build();
```

5. **Сделайте поля `firstName` и `lastName` обязательными для `User.Builder`.** (Сложность: 3/5)
```java
public class User {
    private String firstName;
    private String lastName;
    private String email;
    private String phone;
    private String address;

    private User(Builder builder) {
        this.firstName = builder.firstName;
        this.lastName = builder.lastName;
        this.email = builder.email;
        this.phone = builder.phone;
        this.address = builder.address;
    }

    public static class Builder {
        private String firstName;
        private String lastName;
        private String email;
        private String phone;
        private String address;

        public Builder(String firstName, String lastName) {
            this.firstName = firstName;
            this.lastName = lastName;
        }

        public Builder email(String email) {
            this.email = email;
            return this;
        }

        public Builder phone(String phone) {
            this.phone = phone;
            return this;
        }

        public Builder address(String address) {
            this.address = address;
            return this;
        }

        public User build() {
            return new User(this);
        }
    }
}

User user = new User.Builder("John", "Doe")
    .email("john.doe@example.com")
    .phone("1234567890")
    .address("123 Main St")
    .build();
```